/**
 * @author wn
 * @date 2023/03/02 16:51:18
 * @description: 全局路由前置导航导航守卫
 * 1 生成 menu 动态路由
 * 2 保存 pinia
 */

import router from '@/router'
import { usePermission } from '@/stores/modules/permissionStore'
import { useUser } from '@/stores/modules/userStore'
import { generateIndexRouter } from '@/utils/routerUtil'

// 第三方的进度条库
import NProgress from 'nprogress'
import 'nprogress/nprogress.css' //这个样式必须引入

NProgress.configure({ showSpinner: false }) // 显示右上角螺旋加载提示

// 白名单中 不做拦截
const whiteList = [
	'/user/login',
	'/sys/login',
	'/sys/loginWithUserCode',
	'/user/register',
	'/user/register-result',
	'/user/alteration',
]

const OAUTH2_LOGIN_PAGE_PATH = 'OAUTH2'
const INDEX_MAIN_PAGE_PATH = '/dashboard/analysis' // 主页
whiteList.push(OAUTH2_LOGIN_PAGE_PATH)
const isOAuth2AppEnv = () => false

router.beforeEach(async (to, from, next) => {
	NProgress.start() // 开启进度条

	// useUser
	const { user: userState, GetPermissionList } = useUser()
	const { token, permissionList } = userState

	// usePermission
	const { setRouters /* permission */ } = usePermission()
	// const { addRouters } = permission

	// 有 token
	if (token) {
		if (to.path === '/user/login' || to.path === OAUTH2_LOGIN_PAGE_PATH) {
			// 进入首页 -- /dashboard/analysis
			next({ path: INDEX_MAIN_PAGE_PATH })
		} else {
			/**
			 * 动态路由 数组为 0
			 * 之前是 userState--permissionList 但是 添加动态路由后 并没有修改
			 * 这里采用 permissionState -- addRouters
			 * !permissionList.length)
			 */
			if (!permissionList.length) {
				// set PermissionList
				// menu 数据 Array
				const menuData = await GetPermissionList().catch(() => {
					// 'logOut'
				})
				if (!menuData) return

				// 动态路由 动态加载组件(/ + 404 + menu)
				const constRoutes = generateIndexRouter(menuData)

				// 添加主界面路由
				await setRouters(constRoutes)
				/**
				 * 根据roles权限生成可访问的路由表
				 * 动态添加可访问路由表
				 * usePermission : routers--已经有 constantRouterMap, 选 addRouters 追加
				 */
				// router.addRoutes(addRouters)

				constRoutes.forEach(v => router.addRoute(v))

				/**
				 * page1页面刷新 没有 token 跳转 login?redirect=/page1?id=10
				 * 登陆成功  跳转 main首页 可以跳转时看是否 有 query.redirect router.push(route.query.redirectUrl || '/')
				 * 也可这里处理
				 * 登陆成功 有 token 动态创建 menu 跳转 main
				 * form login?redirect=/page1?id=10
				 * to main
				 * redirect = /page1?id=10 || main
				 */
				const redirect = decodeURIComponent(from.query.redirect || to.path)
				if (to.path === redirect) {
					// 再次进来  走 最后的 next()
					// hack方法 确保addRoutes已完成 ,set the replace: true so the navigation will not leave a history record
					next({ ...to, replace: true })
				} else {
					// 跳转到 重定向
					next({ path: redirect })
				}
			} else {
				next()
			}
		}
	}
	// 没有 token
	else {
		// 没有 token 在 白名单中  -- 去 获取 token 的路上
		if (whiteList.indexOf(to.path) !== -1) {
			// 在免登录白名单，如果进入的页面是login页面并且当前是OAuth2app环境，就进入OAuth2登录页面
			// Test 不是 OAuth2
			if (to.path === '/user/login' && isOAuth2AppEnv()) {
				next({ path: OAUTH2_LOGIN_PAGE_PATH })
			} else {
				// 在白名单，login没有授权 else直接放行
				// login 有授权，先next(授权) 在进入 不是 login  else 直接放行
				next()
			}
		} else {
			// 没有 token 不在 白名单中  --引导 登陆去获得 token
			// 如果当前是在OAuth2APP环境，就跳转到OAuth2登录页面 白名单中  直接 else next()
			const path = isOAuth2AppEnv() ? OAUTH2_LOGIN_PAGE_PATH : '/user/login'
			const query = to.path === '/' || {
				redirect: encodeURIComponent(to.fullPath),
			}
			next({ path: path, query })
		}
	}
})

// 导航结束 页面显示  改标题  meta.title
router.afterEach(to => {
	NProgress.done() // 完成进度条
	const str = '深圳市商用软件有限公司WMS/MES/APS系统'
	const title = to.meta.title ? `${to.meta.title} · ${str}` : str
	document.title = title
})
